﻿using System.ComponentModel;
using System.Reflection;

public static class EnumHelper
{
    // 获取枚举值的描述信息
    public static string GetDescription(Enum value)
    {
        var field = value.GetType().GetField(value.ToString());
        var attribute = field?.GetCustomAttribute<DescriptionAttribute>();
        return attribute?.Description ?? value.ToString();
    }

    // 获取枚举的所有值
    public static T[] GetValues<T>() where T : Enum
    {
        return (T[])Enum.GetValues(typeof(T));
    }

    // 根据名称获取枚举值
    public static T Parse<T>(string name) where T : Enum
    {
        return (T)Enum.Parse(typeof(T), name);
    }

    // 安全地根据名称获取枚举值
    public static T TryParse<T>(string name, T defaultValue = default) where T : Enum
    {
        if (string.IsNullOrWhiteSpace(name))
            return defaultValue;

        return Enum.TryParse(typeof(T), name, true, out var result)
            ? (T)result
            : defaultValue;
    }

    // 获取枚举的所有名称
    public static string[] GetNames<T>() where T : Enum
    {
        return Enum.GetNames(typeof(T));
    }

    /// <summary>
    /// 获取枚举名称
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value"></param>
    /// <returns></returns>
    public static string GetName<T>(T value) where T : Enum
    {
        return Enum.GetName(typeof(T), value);
    }


    // 检查枚举值是否包含标志
    public static bool HasFlag<T>(this T value, T flag) where T : Enum
    {
        return value.HasFlag(flag);
    }

    // 获取枚举值的显示名称(优先使用Description特性)
    public static string GetDisplayName(Enum value)
    {
        var displayAttribute = value.GetType()
            .GetField(value.ToString())
            ?.GetCustomAttribute<DisplayNameAttribute>();

        return displayAttribute?.DisplayName ?? value.ToString();
    }
}
